package com.wang.judge.callback;

import cn.hutool.core.util.StrUtil;
import com.wang.common.core.enums.CodeRunStatus;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.StreamType;
import com.github.dockerjava.core.command.ExecStartResultCallback;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
/*
  用于处理 Docker 命令执行结果的回调处理器
 */
public class DockerStartResultCallback extends ExecStartResultCallback {

    private CodeRunStatus codeRunStatus;  //记录执行成功还是失败,用于记录执行的最终状态

    private String errorMessage; //用于收集错误信息

    private String message; //用于收集正常输出信息

    @Override
    public void onNext(Frame frame) {
        StreamType streamType = frame.getStreamType(); //判断流的类型,检查帧(frame)是来自STDERR还是STDOUT,即正常流还是错误流
        if (StreamType.STDERR.equals(streamType)) {
            //处理错误流,把错误信息追加到errorMessage之后
            if (StrUtil.isEmpty(errorMessage)) {
                errorMessage = new String(frame.getPayload());
            } else {
                errorMessage = errorMessage + new String(frame.getPayload());
            }
            //并把运行状态设置为运行错误
            codeRunStatus = CodeRunStatus.FAILED;
        } else {
            //处理正常流,把正常信息追加到message之后
            message = new String(frame.getPayload());
            //并把运行状态设置为运行成功
            codeRunStatus = CodeRunStatus.SUCCEED;
        }
        //最后调用父类的方法保证完整的回调链
        super.onNext(frame);
    }
}
